import os
import sys
import decimal

from operator import itemgetter

#FILE = "Friends - 10x17 - The Last One (1).en.srt"
FILE = "Harry Potter - The Half Blood Prince - 2009.srt"
FILE = "Friends - 10x08 - The One With The Late Thanksgiving.en.srt"
DIRMASTERFILE = os.path.curdir
DIRSAMPLEFILE = os.path.abspath('')
INVALIDACHAR = ":,.-?!</>\""
MASTERWORDNAME = "masterword.txt"
MASTERWORDFILE = os.path.join(os.path.normpath(DIRMASTERFILE), MASTERWORDNAME)


def getranking(num_words=-1, orde=True):
    """muestra el ranking de palabras, num_wors=cantidad de palabras a mostrar
    -1 por defecto todas, orde= al orden asc=0 desc= 1 por defecto descendente
    """

    rankingtable = []
    cant = 0
    cant_samples = 0
    suma = 0
    #sumatoria de cantidades de veces usada div por la cantidad de samples
    prom_uso_cant = 0
    prom_uso_porc = 0  # porcentaje de veces usadas el total de samples

    mastertable = getMasterTable()
    cant_samples = len(mastertable.items()[0][1])  # cantidad de samples

    for word in mastertable:
        suma = 0
        suma_sample = 0
        prom_uso_cant = 0
        prom_uso_porc = 0

        for sample in mastertable[word]:
            suma += int(sample)
            if int(sample) > 0:
                suma_sample += 1

        prom_uso_cant = decimal.Decimal(suma) / decimal.Decimal(cant_samples)
        prom_uso_porc = (suma_sample * 100) / cant_samples

        rankingtable.append((word, prom_uso_porc, suma, prom_uso_cant))

    table = sorted(rankingtable, key=itemgetter(1, 2), reverse=orde)

    for word in table:
        cant += 1
        print str(cant) + "   :  " + word[0] + ": " + \
              str(word[1]) + "(%): " + \
              str(word[2]) + "(Tot): " + \
              word[3].to_eng_string()[0:4] + "(Prom):"

        if num_words == cant:
            break


def getMasterTable():
    """Leo la base de datos de palabras y la devuelvo
       en un diccionario cuya Key es la palabra y el VALUE
       es una lista de cantidades
     """
    linea = ""
    mastertable = {}
    try:

        f = open(MASTERWORDFILE, 'r')

        for word in f.readlines():
            linea = word.split(":")
            linea[-1] = linea[-1].strip()  # saco el fin de linea "\n"
            mastertable[linea[0]] = linea[1:]

        f.close()

    except:  # la primera vez el archivo no esta creado
            pass

    return mastertable


def writeMasterTable(wordtable):
    """Lee el contenido del archivo de palabras, en memoria actualiza los datos
     con los obtenidos y vuelve a escribir el tabla en memoria"""

    mastertable = getMasterTable()
    # leo la tabla nueva y busco en la maestra la palabra
    if len(mastertable) != 0:  # la primera vez el archivo
                               # MASTERWORDNAME esta vacio
        # relleno la mastertable con una nueva muestra en cero
        # esto es para sacar un promedio de uso de palabras
        for word in mastertable:
            mastertable[word].append("0")

        cantsamples = len(mastertable.items()[0][1])  # cuento la cantidad
                                                      # de samples

        for word in wordtable:
            if word in mastertable:
                # al ultimo elemento .. en este caso el cero agregado arriba
                # le cambio el valor por la cantidad de ocurrencias de
                # esa palabra
                mastertable[word][-1] = wordtable[word]

            else:
                # si la palabra es nueva
                mastertable[word] = []
                # rellenar con ceros
                mastertable[word].extend(["0"] * cantsamples)
                # ultimo sample le agrego la cantidad encontrada
                mastertable[word][-1] = wordtable[word]

        f = open(MASTERWORDFILE, 'w')
        for word in mastertable:
            linea = word
            for o in mastertable[word]:
                linea += ":" + str(o)
            linea += "\n"
            f.write(linea)
        f.close()

    else:
        f = open(MASTERWORDFILE, 'w')
        for word in wordtable:
            linea = word + ":" + str(wordtable[word]) + "\n"
            f.write(linea)
        f.close()


def getWordTable(file):
    """Recibe el archivo del cual se quieren extraer las palabras
    """
    wordtable = {}  # diccionario para almacenar las palabras
    f = open(os.path.join(DIRSAMPLEFILE, file), 'r')

    for line in f.readlines():
        if line[0].isdigit():
            continue
        words = line.split()

        for word in words:

            word = word.lower()  # minuscula

            # saco los invalidchar
            for invchar in INVALIDACHAR:
                word = word.replace(invchar, "")
            # verifico que la palabra no sea un numero o un espacio
            if word.isdigit():
                continue
            elif word.isspace():
                continue
            elif word == "":
                continue

            if word in wordtable:
                wordtable[word] += 1
            else:
                wordtable[word] = 1
    f.close()

    return wordtable


def getSamplesList(folder):
    """Obtnego el nombre de los archivos que seran procesados"""
    samplelist = []
    folder = os.path.normpath(folder)
    try:
        for f in os.listdir(folder):
            if os.path.isfile(os.path.join(folder, f)):
                samplelist.append(f)
    except:
        print "El path ingresado es incorrecto"

    return samplelist


if __name__ == "__main__":
    if len(sys.argv) >= 3:
        print "'Folder archivos de samples' \
              'Nombre de la base de datos de palabras' "
    else:
        if sys.argv[1].startswith("\\"):
            DIRSAMPLEFILE = DIRSAMPLEFILE + sys.argv[1]
        else:
            DIRSAMPLEFILE = os.path.normpath(sys.argv[1])

        if len(sys.argv[1:]) == 2:
            DIRMASTERFILE = os.path.curdir
            MASTERWORDNAME = sys.argv[2]
            MASTERWORDFILE = os.path.join(os.path.normpath(DIRMASTERFILE), \
                            MASTERWORDNAME)

        samplefiles = getSamplesList(DIRSAMPLEFILE)

        for samplefile in samplefiles:
            print "leyendo.... " + samplefile
            wordtable = getWordTable(samplefile)
            print "escribiendo.... " + samplefile
            writeMasterTable(wordtable)






getranking(100)





##Obtner dialogos de peliculas en ingles, extraer las palabras que en ellos se encuentran
##con el objetivo de hacer un ranking de palabras mas usadas.
##
##1: los archivos seran leidos de un directorio en particular
##   por el formato de archivos que se lee, se deben leer las lineas que no comienzan con
##   un numero
##
##2: se lee el archivo(uno por vez) linea por linea y cuentan la cantidad de veces que aparece una palabra
##   - se ponen todas las palabras en minuscula(para evitar tener que distinguir en palabras escritas en mayusculas)
##   - se eliminan caracteres invalidos por ejemplo ,!?-:
##
##3: se graban las palabras en un archivo de texto(MASTERWORDNAME.txt) que tiene el siguiente formato
##
##   palabra:cant1:cant2:cant3:cantN...
##
##   se graba de la siguiente forma, primero se busca en el archivo para ver si ya existe, en caso de ser verdadero
##   se agrega ":" mas la nueva cantidad
##   si la palabra no existe en el archivo maestro, se la agrega al final, con el formato "palabra:cantN"
##
